home *** CD-ROM | disk | FTP | other *** search
- /*
- * NameTable abstract class
- *
- * Sequentially-searched lookup table. Grows as necessary.
- * Intended for small lookup tables that use a 32 bit quantity,
- * not a general object as a key (compared by ==). This means
- * that the Name objects can be used (because they are unique)
- * as can arbitrary long-words (like function addresses,
- * #defined symbolic constants, etc.)
- *
- *
- * Copyright © John Wainwright 1988
- *
- * SuperClasses :
- *
- * Instance Vars :
- * table
- * size
- * Class Vars :
- *
- * Methods :
- * new s t - creates a NameTable of size & type
- * get k - gets the keyed value
- * bind k v - create a binding
- * softBind k v - create a binding only if not there
- * push k v - push v onto the keyed list
- * sequence - setup table sequencing
- * next - next value in table
- * nextKey - next key in table
- * dispose
- * Class Methods :
- *
- */
-
- #include "oic.h"
- #include "generics.h"
-
- class NameTable; /* the NameTable class */
-
- typedef struct /* table entry */
- {
- long key; /* key */
- object val; /* value */
- } binding;
-
- struct NameTable_i /* NameTable instance structure */
- {
- binding *bindings; /* array of bindings */
- int size; /* table size */
- int seqCursor; /* cursor used for sequencing */
- };
- typedef struct NameTable_i NameTable_i;
-
- /* -------------------- NameTable Instance methods ------------------- */
-
- method object
- _bind(self, n, ap)
- object self;
- register NameTable_i *n;
- register struct
- {
- long key;
- object value;
- } *ap;
- {
- register binding *b;
- register int i;
-
- for (b = n->bindings, i = n->size; i--; b++)
- if (b->key == ap->key)
- {
- b->val = ap->value;
- return;
- }
-
- if (n->bindings == NULL)
- n->bindings = talloc(binding);
- else
- n->bindings = (binding *)srealloc(n->bindings,
- sizeof(binding) * (n->size + 1));
-
- b = &n->bindings[n->size++];
- b->key = ap->key;
- b->val = ap->value;
- }
-
- method object
- _softBind(self, n, ap)
- object self;
- register NameTable_i *n;
- register struct
- {
- long key;
- object value;
- } *ap;
- {
- register binding *b;
- register int i;
-
- for (b = n->bindings, i = n->size; i--; b++)
- if (b->key == ap->key)
- return;
-
- if (n->bindings == NULL)
- n->bindings = talloc(binding);
- else
- n->bindings = (binding *)srealloc(n->bindings,
- sizeof(binding) * (n->size + 1));
-
- b = &n->bindings[n->size++];
- b->key = ap->key;
- b->val = ap->value;
- }
-
- method object
- _push(self, n, ap)
- object self;
- register NameTable_i *n;
- register struct
- {
- long key;
- object value;
- } *ap;
- {
- register binding *b;
- register int i;
-
- for (b = n->bindings, i = n->size; i--; b++)
- if (b->key == ap->key)
- {
- b->val = push(b->val, ap->value);
- return;
- }
-
- if (n->bindings == NULL)
- n->bindings = talloc(binding);
- else
- n->bindings = (binding *)srealloc(n->bindings,
- sizeof(binding) * (n->size + 1));
-
- b = &n->bindings[n->size++];
- b->key = ap->key;
- b->val = New(List, ap->value, END);
- }
-
- method object
- _get(self, n, key)
- object self;
- register NameTable_i *n;
- register long *key;
- {
- register binding *b;
- register int i;
-
- for (b = n->bindings, i = n->size; i--; b++)
- if (b->key == *key)
- return b->val;
- return NULL;
- }
-
- method void
- _delete(self, n, key)
- object self;
- register NameTable_i *n;
- register long *key;
- {
- register binding *b;
- register int i;
-
- for (b = n->bindings, i = n->size; i--; b++)
- if (b->key == *key)
- b->key = NULL;
- }
-
- method object
- _sequence(self, n) /* reset sequence start */
- object self;
- register NameTable_i *n;
- {
- n->seqCursor = 0;
-
- return self;
- }
-
- method object
- _next(self, n) /* next value from sequence */
- object self;
- register NameTable_i *n;
- {
- register binding *b;
-
- while (n->seqCursor < n->size && (b = &n->bindings[n->seqCursor])->key == NULL)
- n->seqCursor++;
- if (n->seqCursor++ < n->size)
- return b->val;
- else
- return NULL;
- }
-
- method long
- _nextKey(self, n) /* next key from sequence */
- object self;
- register NameTable_i *n;
- {
- register long k;
-
- while (n->seqCursor < n->size && (k = n->bindings[n->seqCursor].key) == NULL)
- n->seqCursor++;
- if (n->seqCursor++ < n->size)
- return k;
- else
- return NULL;
- }
-
- method object
- _dispose(self, n)
- object self;
- register NameTable_i *n;
- {
- free(n->bindings);
- Super(self);
- }
-
- /* ------------------- Init the NameTable class ---------------------- */
-
- InitNameTable()
- {
- NameTable = NewClass(sizeof(NameTable_i), 0, "NameTable", END);
- AddMethods(NameTable,
- bindGeneric, _bind,
- pushGeneric, _push,
- getGeneric, _get,
- deleteGeneric, _delete,
- softBindGeneric, _softBind,
- nextGeneric, _next,
- nextKeyGeneric, _nextKey,
- sequenceGeneric, _sequence,
- disposeGeneric, _dispose,
- END);
- }
-
-